package com.cskaoyan.extend.override;

/*
        父类方法的覆盖问题：
        1. 子类中能否定义和父类一模一样的方法?  可以

        2. 如果可以，那么在子类对象中访问这个一模一样 的方法，
           究竟访问到的是父类对象中的方法，还是子类对象中的方法？ 访问的是子类定义的方法
           如果在父类中访问呢？ 访问到的是还是子类中定义的一摸一样的方法

        3. 是否可以在子类对象中，同时访问到子类对象和父类对象中的同名成员方法？
           可以，使用super.方法的形式，在子类中调用父类中定义的一模一样的方法

        解释一下，在jvm中所要确定索要执行的方法(在子类对象上调用方法)

      jvm是如何确定执行哪个方法的？
     a. 首先，会在子类对象对应的子类中去找，要执行的方法，如果找到，就直接执行。
     b. 如果在子类中，没有找到，要执行的目标方法，才会在父类中这个方法。

    所以，基于以上的方法执行的，搜索策略：所以因为在子类对象上，调用那个子类和父类一模一样的方法，
    所以，永远先找到子类中定义的那个，一模一样的方法并执行。







 */
public class Demo1 {

    public static void main(String[] args) {

        OverrideSon overrideSon = new OverrideSon();

        // 在子类对象上调用子类定义的方法
        //overrideSon.sonCall(); //override son

        // 在子类对象上调用父类定义的方法
        //overrideSon.fatherCall(); // override son

        // 子类对象上，调用子类方法
        overrideSon.allCall();



    }
}

class OverrideFather {
    public void method() {
        System.out.println("override father");
    }

    /*
         在父类方法中，调用父类子类定义一模一样的方法
     */
    public void  fatherCall() {
        this.method();
    }

}


class OverrideSon extends OverrideFather {
    /*
         和父类中的方法一摸一样的方法
     */
    public void method() {
        System.out.println("override son");
    }
    /*
         在子类中，访问父类子类定义的一摸一样的方法
     */
    public void sonCall() {
        this.method();
    }

    /*
        在子类方法中，既访问父类中定义一摸一样的方法，
        又访问子类中定义一摸一样的方法
     */
    public void allCall() {
        //  调用子类中定义的方法
        this.method();

        //调用父类中定义的一摸一样的方法
        super.method();
    }
}